#ifndef ZLBASE_DEVICE_IDEVICE_H_
#define ZLBASE_DEVICE_IDEVICE_H_

#include <cstdint>
#include <memory>

#include "zlbase/global.h"

namespace zl
{
namespace zlbase
{
/// \brief 设备类型定义
enum EDeviceType
{
    EDeviceType_DCB = ZLBASE_DEVICE(1000),  ///< 开门板
    EDeviceType_MCB = ZLBASE_DEVICE(2000),  ///< 监控板
    EDeviceType_TCB = ZLBASE_DEVICE(3000)   ///< 温控板
};

/// \brief 设备基类
/// \note 所有设备都继承自该接口
class ZLBASE_API IDevice
{
public:
    IDevice();
    virtual ~IDevice();

    /// \brief 获取设备ID 每个设备对象都有一个唯一的设备ID，用于标识该设备
    /// \return 设备的唯一ID
    int32_t Id();

    /// \brief 设置板号
    void SetNumber(int32_t num);

    /// \brief 获取板号
    int32_t GetNumber();

    /// \brief 连接到设备
    virtual int32_t Open();

    /// \brief 断开连接
    virtual void Close();

    /// 设备是否连接
    virtual bool IsOpen();

    /// \brief 自定义功能接口
    ///
    /// 用于执行一些自定义的行为
    virtual int32_t Execute(const unsigned char *command, size_t command_len,
                            unsigned char *result, size_t &result_len);

    // 通用功能接口

    /// \brief 设置开门板IP地址和MAC地址
    ///
    /// 设置指定开门板的MAC地址和IP地址（广播指令）,一个开门版只有一个ip和mac地址
    /// \param[in] ip 指定开门版的IP地址
    /// \param[in] mac 指定开门版的MAC地址
    /// \return 错误码
    virtual int32_t SetAddressInfo(const char *ip, const char *mac);

    /// \brief 获取开门板MAC地址和IP地址
    ///
    /// 获取指定开门板的MAC地址和IP地址（广播指令）,一个开门版只有一个ip和mac地址
    /// \param[out] ip 指定开门版的IP地址
    /// \param[out] mac 指定开门版的MAC地址
    /// \return 错误码
    virtual int32_t GetAddressInfo(char *ip, char *mac);

    /// \brief 设置开门板MAC地址
    ///
    /// 开门板预设置的新的MAC地址（单播指令）
    /// \param[in] mac 指定开门版的MAC地址
    /// \return 错误码
    virtual int32_t SetMacAddress(const char *mac);

    /// \brief 获取开门板MAC地址
    ///
    /// 获取开门板MAC地址（单播指令）
    /// \param[out] mac 指定开门版的MAC地址
    /// \return 错误码
    virtual int32_t GetMacAddress(char *mac);

    /// \brief 查询列号
    ///
    /// 查询列号指令（单播指令）
    /// \param[out] column 指定开门板列号
    /// \return 错误码
    virtual int32_t GetColumn(int32_t &column);

    /// \brief 查询固件版本号
    ///
    /// 查询固件版本号
    /// \param[out] version “V2.00”：固件版本号
    /// \return 错误码F
    virtual int32_t GetFirmwareVersion(char *version);

private:
    class IDevicePrivate;
    IDevicePrivate *p_;
};

}  // namespace zlbase
}  // namespace zl

#endif  // ZLBASE_DEVICE_IDEVICE_H_